package com.zwh.rabbitmq.basic.consumer;

import java.io.IOException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.stereotype.Service;

import com.rabbitmq.client.Channel;

/**
 * 消息接受者
 *
 * 声明消息监听者的方式，
 * 1、直接监听队列，不自动创建 queue 队列和 exchange 交换机
 * 2、当队列和交换机不存在时，自动创建队列和交换机
 *
 * @author monkey
 * @date 2020/11/6 15:17
 **/
@Service
public class TestListener1 {

    private static Logger log = LoggerFactory.getLogger(TestListener1.class);

    /**
     * 方式1、队列和交换机已经被生产者定义 <br/>
     * 使用queues属性监听指定的名称的 队列的消息<br/>
     * 队列名称：project.info.delete
     *
     * 当使用手动ack 消费消息时，需要手动响应
     *
     * @param message
     * @param channel
     */
//    @RabbitListener(queues = "project.info.delete")
    public void testListener1(Message message, Channel channel) throws IOException {
        // 手动ack， 需要传递消息序列号， false表示只对当前这个消息进行响应（不对序列号之前的消息进行批量处理）。
        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
    }

    /**
     * 方式2、监听队列同时，自动创建 queue 队列和 exchange 交换机 <br/>
     * 使用 bindings属性来声明 队列，交换机和绑定的 routingKey
     *
     */
//    @RabbitListener(bindings = @QueueBinding(
//            value = @Queue(value = "project.info.delete", durable = "true", autoDelete = "false"),
//            exchange = @Exchange(value = "exchange.project", type = ExchangeTypes.DIRECT),
//            key = "project.info.delete"))
    public void testListener2(Message message, Channel channel)
            throws IOException {
        try {
            // 处理数据
            log.info("接收mq消息：{}", new String(message.getBody()));

        } catch (Exception e) {
            log.error("Exception异常：{}", e.getMessage());
            e.printStackTrace();
            // 消息处理异常，发送Nack响应, 不返回队列
            channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
            return;
        }
        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
    }


//    /**
//     * 客户秒杀商品 消费者
//     * @param message
//     */
//    @RabbitListener(queues= DirectExchangeConfig.SECONDKILL_QUEUE)
//    public void receive(String message) {
//        log.info("receive message:"+message);
//        //String 转换成Bean对象
//        UserBuyGoodsMessage userBuyGoodsMessage  = JSONObject.parseObject(message, UserBuyGoodsMessage.class);
//        String goodsId = userBuyGoodsMessage.getGoodsId();
//        // TODO 判断消息重复消费处理
//
//        //判断是否已经秒杀到了
//        // 是否已经下单
//        Order order = goodsService.getByUserIdWithGoodsId(userBuyGoodsMessage.getUserId(), goodsId);
//        if(order != null) {
//            return;
//        }
//        //通过商品id查询秒杀商品
//        Goods goods = goodsService.getById(goodsId);
//
//        // TODO 如果是多消费者情况下，需要使用update stock_sum=stock_sum -1 where stock_sum-1>=0 来保证原子性操作。
//        //判断库存是否足够
//        int stock = goods.getStockSum();
//        if(stock <= 0) {
//            return;
//        }
//        //减库存 下订单 写入秒杀订单
//        goodsService.realDoBuyGoods(userBuyGoodsMessage.getUserId(), goods);
//    }
}
